home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 February: Tool Chest / Apple Developer CD Series Tool Chest February 1996 (Apple Computer)(1996).iso / Sample Code / AOCE Sample Code / PowerTalk Access Modules / Sample SMSAM / SampleSMSAM Source / CoreGateway / Letter.cp < prev    next >
Encoding:
Text File  |  1995-07-28  |  8.1 KB  |  314 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        Letter.cp
  3.  
  4.     Copyright:    © 1991-1994 by Apple Computer, Inc.
  5.                 All rights reserved.
  6.  
  7.     Part of the AOCE Sample SMSAM Package.  Consult the license
  8.     which came with this software for your specific legal rights.
  9.  
  10. */
  11.  
  12.  
  13.  
  14. #ifndef __LETTER__
  15. #include "Letter.h"
  16. #endif
  17.  
  18. #ifndef __BLJSTANDARDINCLUDES__
  19. #include "BLJStandardIncludes.h"
  20. #endif
  21.  
  22. #ifndef __IOSTREAM__
  23. #include <iostream.h>
  24. #endif
  25.  
  26. #ifndef __BLJOCEUTILITIES__
  27. #include "BLJOCEUtilities.h"
  28. #endif
  29.  
  30. #ifndef __DEBUGGINGGEAR__
  31. #include "DebuggingGear.h"
  32. #endif
  33.  
  34. #ifndef __UTILITIES__
  35. #include "Utilities.h"
  36. #endif
  37.  
  38. /***********************************|****************************************/
  39.  
  40. #pragma segment TLetter
  41.  
  42. /***********************************|****************************************/
  43.  
  44. TLetter::TLetter()
  45. {
  46. }
  47.  
  48. /***********************************|****************************************/
  49.  
  50. TLetter::~TLetter()
  51. {
  52. }
  53.  
  54. /***********************************|****************************************/
  55.  
  56. void TLetter::Minimize() {
  57.     //    Don't do anything...
  58. }
  59.  
  60. /***********************************|****************************************/
  61.  
  62. Boolean
  63. TLetter::LetterIsCompleted ()
  64. {
  65.     return false;    // the subclasses should implement this
  66. }
  67.  
  68. /***********************************|****************************************/
  69.  
  70. Boolean TLetter::SetAllUnknownRecipientStatus ( TLetter* letter, const RecipientStatusSet& status )
  71. {    
  72.     Boolean result = ( letter != nil );
  73.  
  74.     if ( letter )
  75.         for ( RecipientTypeSet type = toRecipient ; type <= bccRecipient ; ++ type )
  76.             for ( unsigned long index = 1 ; index <= letter->GetRecipientCount ( type ) ; ++ index )
  77.             {
  78.                 TRecipient* recipient = letter->GetRecipient ( type, index );
  79.                 
  80.                 if ( recipient && ( recipient->GetStatus () <= cUnknown ) )
  81.                     result = result && recipient->SetStatus ( status );
  82.             }
  83.  
  84.     return result;
  85. }
  86.  
  87. /***********************************|****************************************/
  88.  
  89. char ShowRecipientIfNonNil (ostream& s, const TRecipient *r) 
  90. {
  91.     if (r)
  92.         r->Describe(s);
  93.     else
  94.         s << "nil TRecipient";
  95.     return ' ';
  96. }
  97.  
  98. /***********************************|****************************************/
  99.  
  100. ostream& TLetter::Describe(ostream& s) const
  101. {
  102.  
  103.     s << "== TLetter ====================================================================" << endl;
  104.     
  105.     {    TRString                subject;
  106.         BLJTime                sendTime;
  107.         
  108.         GetSubject (subject);
  109.         GetSendTimeStamp (sendTime);
  110.         
  111.         s << "Sub: " << subject << "  " << sendTime << endl;
  112.     }
  113.  
  114.     if (keithFlag.Flag(3)) {
  115.         BLJLetterID            letterID, replyID, conversationID;
  116.         if (GetLetterID (letterID))    s << "LetterID:" << letterID << endl;
  117.         if (GetReplyID (replyID))    s << "ReplyID: " << replyID << endl;
  118.         if (GetConversationID (conversationID))    s << "ConvID:  " << conversationID << endl;
  119.     }
  120.  
  121.     {    short    index;
  122.  
  123.         for (index = 1; index <= GetRecipientCount (fromRecipient); index++) {
  124.             s << " from:"; ShowRecipientIfNonNil (s, GetRecipient (fromRecipient, index)); s << endl;
  125.         }
  126.     
  127.         for (index = 1; index <= GetRecipientCount (toRecipient); index++) {
  128.             s << " to:  "; ShowRecipientIfNonNil (s, GetRecipient (toRecipient, index));
  129.             RecipientStatusSet status;
  130.             if (GetRecipientStatus(toRecipient, index, status)) {
  131.                 s << " [[";
  132.                 switch (status) {
  133.                     case cUnknown: s << "Unknown "; break;
  134.                     case cReceived: s << "Recieved "; break;
  135.                     case cNotReceived: s << "Not-recieved "; break;
  136.                     case cTimedOut: s << "Timed-out "; break;
  137.                     default: s << "??? " << (int) status << " "; break;
  138.                 }
  139.                 s << "]]";
  140.             }
  141.             s << flush << endl;
  142.         }
  143.  
  144.         for (index = 1; index <= GetRecipientCount (ccRecipient); index++) {
  145.             s << " cc:  "; ShowRecipientIfNonNil (s, GetRecipient (ccRecipient, index));
  146.             RecipientStatusSet status;
  147.             if (GetRecipientStatus(ccRecipient, index, status)) {
  148.                 s << " [[";
  149.                 switch (status) {
  150.                     case cUnknown: s << "Unknown "; break;
  151.                     case cReceived: s << "Recieved "; break;
  152.                     case cNotReceived: s << "Not-recieved "; break;
  153.                     case cTimedOut: s << "Timed-out "; break;
  154.                     default: s << "??? " << (int) status << " "; break;
  155.                 }
  156.                 s << "]]";
  157.             }
  158.             s << flush << endl;
  159.         }
  160.         
  161.  
  162.         for (index = 1; index <= GetRecipientCount (bccRecipient); index++) {
  163.             s << " bcc: "; ShowRecipientIfNonNil (s, GetRecipient (bccRecipient, index));
  164.             RecipientStatusSet status;
  165.             if (GetRecipientStatus(bccRecipient, index, status)) {
  166.                 s << " [[";
  167.                 switch (status) {
  168.                     case cUnknown: s << "Unknown "; break;
  169.                     case cReceived: s << "Recieved "; break;
  170.                     case cNotReceived: s << "Not-recieved "; break;
  171.                     case cTimedOut: s << "Timed-out "; break;
  172.                     default: s << "??? " << (int) status << " "; break;
  173.                 }
  174.                 s << "]]";
  175.             }
  176.             s << flush << endl;
  177.         }
  178.         
  179.         s << " Letter contains " << GetUnknownRecipientCount() << " recipients with unknown status." << endl;
  180.     }
  181.  
  182.  
  183.     if (keithFlag.Flag(3)) {
  184.         s << "Content: " << GetContentTypeCount ( ) << " ";
  185.         
  186.             for ( unsigned long i = 1; i <= GetContentTypeCount () ; ++ i )
  187.             {
  188.                 s << "'"; OutputOSType ( s, GetContentType ( i ) ); s << "' ";
  189.             }
  190.             s << endl;
  191.         
  192.         if ( GetSegmentCount( 'TEXT' ) > 0) {
  193.             
  194.             for (short SegmentNumber = 1; SegmentNumber <= GetSegmentCount( 'TEXT' ); ++SegmentNumber) {
  195.                 long            SegmentSize;
  196.                 BLJLetterBlockType    blockType;
  197.                 
  198.                 GetSegmentInfo ('TEXT', SegmentNumber, blockType, SegmentSize);
  199.                 
  200.                 s << "(" << SegmentNumber << ", "; OutputOSType(s, blockType.type); s << ", " << SegmentSize << ") ";
  201.             }
  202.             
  203.             s << endl;
  204.             
  205.             for (SegmentNumber = 1; SegmentNumber <= GetSegmentCount('TEXT'); ++SegmentNumber) 
  206.             {    long            SegmentSize;
  207.                 BLJLetterBlockType    blockType;
  208.                 
  209.                 GetSegmentInfo ('TEXT', SegmentNumber, blockType, SegmentSize);
  210.     
  211.                 if (SegmentSize > 0) {
  212.                 
  213.                     switch (blockType.type) {
  214.                         case 'TEXT':
  215.                         {    long offset = 0;
  216.                             char buffer[80];
  217.                             do {
  218.                                 long bufferSize = 75;
  219.                                 if (bufferSize > SegmentSize)
  220.                                     bufferSize = SegmentSize;
  221.                                 GetSegmentData ('TEXT', SegmentNumber, offset, (void *) buffer, bufferSize);
  222.                                 s.write (buffer,(int) bufferSize);
  223.                                 SegmentSize = SegmentSize - bufferSize;
  224.                                 offset = offset + bufferSize;
  225.                             } while (SegmentSize > 0);
  226.                         }
  227.                         s << endl;
  228.                         break;
  229.  
  230.                         case 'cTXT':
  231.                         {    short scriptCode;
  232.                             long offset = 0;
  233.                             long bufferSize = sizeof(scriptCode);
  234.                             GetSegmentData ('TEXT', SegmentNumber, offset, (void *) &scriptCode, bufferSize);
  235.                             if (scriptCode != smRoman)
  236.                                 s << "[script:" << scriptCode << "] ";
  237.                             SegmentSize -= sizeof(short);
  238.                         }
  239.                         
  240.                         {    long offset = 2;
  241.                             char buffer[80];
  242.                             do {
  243.                                 long bufferSize = 75;
  244.                                 if (bufferSize > SegmentSize)
  245.                                     bufferSize = SegmentSize;
  246.                                 GetSegmentData ('TEXT', SegmentNumber, offset, (void *) buffer, bufferSize);
  247.                                 s.write (buffer,(int) bufferSize);
  248.                                 SegmentSize = SegmentSize - bufferSize;
  249.                                 offset = offset + bufferSize;
  250.                             } while (SegmentSize > 0);
  251.                         }
  252.                         s << endl;
  253.                         break;
  254.                         
  255.                         case 'PICT':
  256.                             s << "(PICT segment data not shown)" << endl;
  257.                             break;
  258.                             
  259.                         case 'AIFF':
  260.                             s << "(AIFF segment data not shown)" << endl;
  261.                             break;
  262.                             
  263.                         default:
  264.                             s << "('"; OutputOSType(s, blockType.type); s << " segment data not shown)" << endl;
  265.                             break;
  266.                     }
  267.                 }
  268.             }
  269.         }
  270.     } else {
  271.         s << "Content:  " << GetSegmentCount( 'TEXT' ) << " Segments NOT SHOWN." << endl;
  272.     }
  273.  
  274.     DescribeSubclass(s);
  275.  
  276.     if (keithFlag.Flag(3)) {
  277.         for (short index = 1; index <= GetNestedLetterCount(); ++index) {
  278.             TLetter *nestedLetter = GetNestedLetter(index);
  279.             
  280.             s << *nestedLetter;
  281.         }
  282.     } else {
  283.         s << "There are " << GetNestedLetterCount() << " letters nested inside this letter." << endl;
  284.     }
  285.         
  286.     s << "== TLetter end =================================================================" << endl;
  287.     
  288.     return s;
  289. }
  290.  
  291. /***********************************|****************************************/
  292.  
  293. ostream& TLetter::DescribeSubclass(ostream& s) const
  294. {
  295.     return s;
  296. }
  297.  
  298. /***********************************|****************************************/
  299.  
  300. //    This probably will never be called
  301. ostream& TLetter::operator >> ( ostream& s ) const
  302. {
  303.     s << "TLetter:'";
  304.     
  305.     TRString subject;
  306.     if (GetSubject(subject))
  307.         s << subject;
  308.     
  309.     s << " unknownRecpts:" << GetUnknownRecipientCount() << endl;
  310.     
  311.     return s;
  312. }
  313.  
  314.